import os
import sys
import json
from pathlib import Path
from modules.ExcelParser import ExcelParser
from modules.YamlParser import YamlParser
from modules.CCodeGenerator import CCodeGenerator
from modules.SlaveInfoGenerator import SlaveInfoGenerator
from modules.context import create_global_context

def validate_excel_file(file_path):
    """验证文件是否为Excel文件"""
    if not os.path.isfile(file_path):
        raise FileNotFoundError(f"文件 '{file_path}' 不存在")
    
    validExtensions = {'.xls', '.xlsx', '.xlsm'}
    file_ext = Path(file_path).suffix.lower()
    
    if file_ext not in validExtensions:
        raise ValueError(f"不支持的文件格式 '{file_ext}'，仅支持 {', '.join(validExtensions)}")

def ensure_directory_exists(dir_path):
    """确保目录存在，不存在则创建"""
    path = Path(dir_path)
    if not path.exists():
        path.mkdir(parents=True, exist_ok=True)
        print(f"已自动创建目录: {path.resolve()}")
    elif not path.is_dir():
        raise NotADirectoryError(f"路径 '{dir_path}' 已存在但不是目录")


def main():
    if len(sys.argv) != 2:
        print("用法: python script.py <配置文件.yaml>")
        sys.exit(1)

    # 1. 获取配置文件相对路径
    yamlPath =  os.path.abspath(sys.argv[1])
    
    # 2. 创建全局上下文
    context = create_global_context()
    context.yaml_dir = os.path.dirname(yamlPath)

    yamlPaser = YamlParser(yamlPath)
    yamlPaser.check_yaml()
    context.yaml = yamlPaser

    # 3. 验证Excel文件
    try:
        for excel in context.yaml.excels:
            validate_excel_file(excel["path"])
            ensure_directory_exists(excel["output"])
    except Exception as e:
        print(f"错误: {e}")
        sys.exit(1)

    # 4. 打开Excel文件
    excels = list()
    for excel in context.yaml.excels:
        parser = ExcelParser()
        excelPath = excel["path"]
        if parser.openExcel(excelPath) is False:
            print(f"Excel文件打开失败")
            sys.exit(1)
        print(f"正在处理Excel文件: {excelPath}")
        if parser.formatCheck() is False:
            print(f"Excel文件格式检查失败，不符合要求，请参考文档。")
            sys.exit(1)

        excel = parser.parse()
        excels.append(excel)

        if context.yaml.debug["json_file"]:
            os.makedirs(context.yaml.debug["json_output"], exist_ok=True)
            with open(os.path.join(context.yaml.debug["json_output"], os.path.basename(excel["file"])) + ".json", "w", encoding="utf-8") as f:
                f.write(json.dumps(excel, indent=4, ensure_ascii=False))

    # 5. 生成C文件
    codeGenerator = CCodeGenerator(excels)
    codeGenerator.generate()

    # 6. 生成SlaveInfo文件
    slaveGenerator = SlaveInfoGenerator(excels)
    slaveGenerator.generate()
    
    # 6. 拷贝文件到目标目录
    # os.makedirs(sys.argv[1], exist_ok=True)

if __name__ == "__main__":
    main()